 // 等待OpenCV.js加载完成
 cv['onRuntimeInitialized'] = async function () {
  // 读取图片
  const img = cv.imread('img'); // 将这里的路径替换为你实际的图片路径
  console.log("OpenCV版本: " + cv.version);
  // 获取canvas元素
  const canvas = document.getElementById('myCanvas');

  // 创建一个与canvas大小相同的Mat对象
  const canvasMat = new cv.Mat(canvas.height, canvas.width, cv.CV_8UC4);

  // 将图片数据复制到canvasMat中
  img.copyTo(canvasMat);

  // 将图片转换为灰度图，便于后续轮廓提取操作
  let grayImg = new cv.Mat();
  cv.cvtColor(canvasMat, grayImg, cv.COLOR_RGB2GRAY);

  // 进行边缘检测获取边缘信息
  let detectedEdges = new cv.Mat();
  cv.Canny(grayImg, detectedEdges, 50, 150);

  // 查找轮廓
  let contours = new cv.MatVector();
  let hierarchy = new cv.Mat();
  cv.findContours(detectedEdges, contours, hierarchy, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE);

  // 设置轮廓绘制颜色和厚度
  let color = new cv.Scalar(255, 0, 0, 255); // 蓝色，格式为 [B, G, R, A]
  let thickness = 2;

  // 绘制带有间距的图片外侧轮廓到canvasMat上
  for (let i = 0; i < contours.size(); i++) {
      let contour = contours.get(i);
      let newContour = [];
      for (let j = 0; j < contour.rows; j++) {
          let point = contour.ucharAt(j, 0);
          let x = point.x;
          let y = point.y;

          // 计算轮廓点的法向量方向（这里简单近似处理）
          let dx = 1;
          let dy = 0;
          if (j > 0) {
              let prevPoint = contour.ucharAt(j - 1, 0);
              dx = point.x - prevPoint.x;
              dy = point.y - prevPoint.y;
          }

          // 归一化法向量
          let length = Math.sqrt(dx * dx + dy * dy);
          dx /= length;
          dy /= length;

          // 根据法向量方向和间距进行偏移
          x += dx * 20;
          y += dy * 20;

          let newPoint = new cv.Point(x, y);
          newContour.push(newPoint);
      }

      // 创建一个新的Mat对象，指定类型和大小
      let newContourMat = new cv.Mat(newContour.length, 1, cv.CV_32SC2);

      // 将数组中的点逐个添加到新的Mat对象中
      for (let k = 0; k < newContour.length; k++) {
          // 获取当前点
          let point = newContour[k];
          // 将点的坐标值分别设置到Mat对象对应的位置
          newContourMat.put(k, 0, point.x);
          newContourMat.put(k, 1, point.y);
      }

      // 将Mat对象转换为MatVector类型
      let contourVector = new cv.MatVector();
      contourVector.push_back(newContourMat);

      cv.drawContours(canvasMat, contourVector, 0, color, thickness);

      // 释放内存
      newContourMat.delete();
  }

  // 在canvas上显示图片（带有轮廓及间距）
  cv.imshow('myCanvas', canvasMat);

  // 释放内存
  img.delete();
  canvasMat.delete();
  grayImg.delete();
  detectedEdges.delete();
  contours.delete();
  hierarchy.delete();
};